﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Autocentro.Entities;
using Autocentro.BussinesLogic;
using Microsoft.Practices.Unity;

namespace Autocentro.UI
{
    public partial class FrmMttProforma : Form
    {
        [Dependency]
        public IProformaBL proformaBL { get; set; }

        [Dependency]
        public IProductoBL productoBL { get; set; }

        [Dependency]
        public IVehiculoBL vehiculoBL { get; set; }

        [Dependency]
        public IMarcaBL marcaBL { get; set; }

        [Dependency]
        public IClienteBL clienteBL { get; set; }

        [Dependency]
        public IDetalleProformaBL detalleProformaBL { get; set; }

        [Dependency]
        public IUnidadMedidaBL unidaMedidaBL { get; set; }

        [Dependency]
        public IEmpresaBL empresabl { get; set; }

        [Dependency]
        public ITipoVehiculoBL tipovehiculobl { get; set; }

        [Dependency]
        public IProductoTipoVehiculoBL productotipovehiculobl { get; set; }

        [Dependency]
        public IServicioProgramadoBL servicioprogramadobl { get; set; }

        [Dependency]
        public ICarteraServicioProgramadoBL carteraservicioprogramadobl { get; set; }
       
        public FrmMttProforma()
        {
            InitializeComponent();
            this.BuildUp();
            //Combo.DataSource = unidaMedidaBL.GetAllFromUnidaMedidas();
            pRODUCTOBindingSource.DataSource = productoBL.GetAllFromPrductos();
            CbEmpresa.DataSource = empresabl.GetAllFromEmpresa();
            var a = Convert.ToInt32(CbEmpresa.SelectedValue.ToString());
            CbTipoVehiculo.DataSource = tipovehiculobl.GetAllFromTipoVehiculoByEmpresaId(a);
        }

        private void FrmMttProforma_Load(object sender, EventArgs e)
        {
            Calculartotal();
            lblAyuda.Visible = false;
            lblNewProducto.Visible = false;
            CBServicioProgramado.Enabled = false;
            BtnCargarServ.Enabled = false;
        }

        bool IsNew = true;
        
        public void AddProfora()
        {
            IsNew = true;
            pROFORMABindingSource.AddNew();
            groupBox3.Enabled = false;
            groupBox1.Enabled = false;
            groupBox2.Enabled = false;
            btnGuardar.Enabled = false;
        }

        public void Editar(int id)
        {
            IsNew = false;
            lblAyuda.Visible = false;
            //GBEmpresa.Enabled = false;
            var _proforma = proformaBL.GetFromProformaByID(id);
            
            _proforma.Vehiculo = vehiculoBL.GetFromVehiculoById(_proforma.IdVehiculo);
            _proforma.Vehiculo.Marca = marcaBL.GetFromMarcasByID(_proforma.Vehiculo.IdMarca);
            _proforma.Vehiculo.Cliente = clienteBL.GetFromClienteByID(_proforma.Vehiculo.IdCliente);
            _proforma.DetalleProforma = detalleProformaBL.GetAllFromDetalleProformaByProformaId(_proforma.Id);

            pROFORMABindingSource.DataSource = _proforma;
            pROFORMABindingSource.ResetBindings(true);
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            var _proforma = pROFORMABindingSource.Current as PROFORMA;

            var msg = "ERROR";

            if (_proforma!=null )
            {
                #region IsNew

                    if (IsNew)
                    {
                        try
                        {  //proforma.DetalleProforma.ForEach(d =>d.UnidadMedida = unidades.Where(u =>u.Id.Equals(d.IdUnidadMedida)).SingleOrDefault());
                            _proforma.Observacion = observacionTextBox.Text.ToUpper();
                            proformaBL.AddProforma(_proforma);
                            MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            var rpt = MessageBox.Show(this, string.Format("Desea imprimir la Proforma"),
                                "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                            if (rpt == DialogResult.Yes)
                            {
                                var rpta = MessageBox.Show(this, string.Format("¿La proforma incluye IGV?"),
                               "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                                if (rpta == DialogResult.Yes)
                                {
                                    Reportes.FrmRepProforma frm = new Reportes.FrmRepProforma();
                                    frm.ObtenerId(_proforma.Id);
                                    frm.igv = true;
                                    frm.ShowDialog();
                                }
                                else
                                {
                                    Reportes.FrmRepProforma frm = new Reportes.FrmRepProforma();
                                    frm.ObtenerId(_proforma.Id);
                                    frm.igv = false;
                                    frm.ShowDialog();
                                }

                               
                            }
                            this.Close();
                        }
                        catch (Exception ex)
                        {
                            msg = ex.Message;
                            MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    #endregion
                #region IsEdit
                    else
                    {
                        try
                        {   //proforma.DetalleProforma.ForEach(d => d.UnidadMedida = unidades.Where(u => u.Id.Equals(d.IdUnidadMedida)).SingleOrDefault());
                            _proforma.Observacion = observacionTextBox.Text.ToUpper();
                            proformaBL.UpdateProforma(_proforma);
                            MessageBox.Show("Modificación Correcta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            this.Close();
                        }
                        catch (Exception ex)
                        {
                            msg = ex.Message;
                            MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }

                    }
                    #endregion
            }
        }

        
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            CargaProductos();
        }

        private void txtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                CargaProductos();
            }
        }

        private void CargaProductos()
        {
            List<PRODUCTO_TIPO_VEHICULO> existenProductos;

            var criterio = txtCriterio.Text == string.Empty ? null : txtCriterio.Text;

            var _idtipovehiculo = Convert.ToInt32(CbTipoVehiculo.SelectedValue.ToString());

            existenProductos = productotipovehiculobl.GetFromProductoTipoVehiculoByTipoVehiculoIdAndDescripcionProducto(_idtipovehiculo,txtCriterio.Text);
                

            pRODUCTO_TIPO_VEHICULOBindingSource.DataSource = existenProductos;

            if (existenProductos.Count <= 0)
            {
                lblNewProducto.Visible = true;
            }
            else
            {
                lblNewProducto.Visible = false;
            }
        }

        private void Calculartotal()
        {
            var proforma = pROFORMABindingSource.Current as PROFORMA;
            if (proforma != null)
            {
                proforma.Total = proforma.DetalleProforma.Sum(dv => dv.Monto);
                pROFORMABindingSource.ResetBindings(true);
            }
        }

        private void AgregarProducto()
        {
            var _productotipovehiculo = pRODUCTO_TIPO_VEHICULOBindingSource.Current as PRODUCTO_TIPO_VEHICULO;
            var currentProforma = pROFORMABindingSource.Current as PROFORMA;
            var unidadMedida = uNIDADMEDIDABindingSource.Current as UNIDAD_MEDIDA;

            #region AddServicio
            if (_productotipovehiculo != null && _productotipovehiculo.PRODUCTO.ProductoServicio == true)
            {
                #region AddDetalle
                var _detalle = new DETALLEPROFORMA()
                {
                    IdProforma = currentProforma.Id,
                    ProductoTipoVehiculo = _productotipovehiculo,
                    IdProductoTipoVehiculo = _productotipovehiculo.Id,
                    Cantidad = 1,
                    //IdUnidadMedida = 1,
                    //UnidadMedida = unidaMedidaBL.GetFromUnidadMedidaById(1),
                    PrecioServicioUnit = _productotipovehiculo.Precio
                };
                #endregion

                var existe = currentProforma.DetalleProforma.Where(dv => dv.ProductoTipoVehiculo.Id.Equals(_productotipovehiculo.Id)).SingleOrDefault();
                if (existe == null)
                {
                    currentProforma.DetalleProforma.Add(_detalle);
                    currentProforma.Total = currentProforma.DetalleProforma.Sum(dv => dv.Monto);
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El Servicio {0} " + " ya se encuentra en la proforma", _productotipovehiculo.PRODUCTO.Descripcion),
                        "Mensaje", MessageBoxButtons.OK);
                }

                pROFORMABindingSource.ResetBindings(true);
                detalleProformaBindingSource.ResetBindings(true);

            }

            #endregion
                
            //    //for (int count = 0; count < detalleProformaDataGridView.Rows.Count; count++)
            //    //{
            //    //    int indice = detalleProformaDataGridView.Rows.Count;
            //    //    detalleProformaDataGridView.CurrentCell = detalleProformaDataGridView.Rows[detalleProformaDataGridView.CurrentRow.Index].Cells[0];
            //    //    detalleProformaDataGridView.Rows[detalleProformaDataGridView.SelectedRows[0].Index].ReadOnly = true;

            //    //    if (Convert.ToInt32(detalleProformaDataGridView.Rows[count].Cells[0].Value) == 1)
            //    //    {
            //    //        //detalleProformaDataGridView[1, count].ReadOnly = true; 
            //    //        detalleProformaDataGridView.Rows[detalleProformaDataGridView.SelectedRows[0].Index].ReadOnly = true;
            //    //    }
            //    //}

            //}
            //#endregion 

            #region AddProducto
            if (_productotipovehiculo != null && _productotipovehiculo.PRODUCTO.ProductoServicio == false)
            {
                #region AddDetalle
                var detalle = new DETALLEPROFORMA() 
                {
                    IdProforma = currentProforma.Id,
                    ProductoTipoVehiculo = _productotipovehiculo,
                    IdProductoTipoVehiculo = _productotipovehiculo.Id,
                    Cantidad = 1,
                    //IdUnidadMedida = 4,
                    //UnidadMedida = unidaMedidaBL.GetFromUnidadMedidaById(4),
                    PrecioServicioUnit = _productotipovehiculo.Precio
                };
                #endregion

                var existe = currentProforma.DetalleProforma.Where(dv => dv.ProductoTipoVehiculo.Id.Equals(_productotipovehiculo.Id)).SingleOrDefault();
                if (existe == null)
                {
                    currentProforma.DetalleProforma.Add(detalle);
                    currentProforma.Total = currentProforma.DetalleProforma.Sum(dv => dv.Monto);
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El Producto {0} " + " ya se encuentra en la proforma\n Desea agregar otro?", _productotipovehiculo.PRODUCTO.Descripcion),
                    "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (rpt == DialogResult.Yes)
                    {
                        existe.Cantidad++;
                        currentProforma.Total = currentProforma.DetalleProforma.Sum(dv => dv.Monto);
                        CalcularTotal();
                    }             
                }

                pROFORMABindingSource.ResetBindings(true);
                detalleProformaBindingSource.ResetBindings(true);
            }

            #endregion 
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            QuitarProducto();
        }

        private void QuitarProducto()
        {
            var CurrentProforma = pROFORMABindingSource.Current as PROFORMA;
            var detalle = detalleProformaBindingSource.Current as DETALLEPROFORMA;

            if (CurrentProforma != null)
            {
                var rpt = MessageBox.Show(this,string.Format("El producto: {0}," +"ya se encuentra en le pedido desea Quitar?",detalle.ProductoTipoVehiculo.PRODUCTO.Descripcion),
                   "Quitar Producto",MessageBoxButtons.YesNo,MessageBoxIcon.Question);

                if (rpt == DialogResult.Yes)
                {
                    if (detalle.IdProductoTipoVehiculo > 0)
                    {
                        //detalleProformaBL.DeleteDetalleProforma(detalle.IdProductoTipoVehiculo,CurrentProforma.Id);
                    }
                    detalleProformaBindingSource.RemoveCurrent();
                    Calculartotal();


                }
                pROFORMABindingSource.ResetBindings(true);
                detalleProformaBindingSource.ResetBindings(true);
            }
            else
            {
                MessageBox.Show("Debe seleccionar un detalle para poder quitar de la lista");
            }
        }

        private void placaTextBox_TextChanged(object sender, EventArgs e)
        {
            if (IsNew)
            {
                lblAyuda.Visible = true;
            }
            else
                lblAyuda.Visible = false;
        }

        private void placaTextBox_Leave(object sender, EventArgs e)
        {
            lblAyuda.Visible = false;

            if (placaTextBox.Text.Length == 0)
            {
                MessageBox.Show("Debe Ingresar un número de placa", "Mensaje", MessageBoxButtons.OK);
            }
            else
                if (placaTextBox.Text.Length > 6)
                {
                    CargarVehiculo();
                }
                else MessageBox.Show("Longitud de placa incorrecta", "Mensaje", MessageBoxButtons.OK);
        }

        private void placaTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
            }
        }

        private void placaTextBox_Click(object sender, EventArgs e)
        {
            if (IsNew)
            {
                lblAyuda.Visible = true;
            }
            else
                lblAyuda.Visible = false;
        }

        private void placaTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (placaTextBox.Text.Length == 0)
                {
                    MessageBox.Show("Debe Ingresar un número de placa", "Mensaje", MessageBoxButtons.OK);
                }
                else
                    if (placaTextBox.Text.Length > 6)
                    {
                        CargarVehiculo();
                    }
                    else MessageBox.Show("Longitud de placa incorrecta", "Mensaje", MessageBoxButtons.OK);
            }

            #region BuscarVehiculo
            if (e.KeyCode == Keys.F1)
            {
                FrmVehiculo frm = new FrmVehiculo();
                frm.Vehi = true;
                frm.ShowDialog();
                if (frm.CurrentVehiculo != null)
                {
                    var _proforma = pROFORMABindingSource.Current as PROFORMA;
                    _proforma.Vehiculo = frm.CurrentVehiculo;
                    _proforma.IdVehiculo = frm.CurrentVehiculo.Id;

                    //proforma.Vehiculo.Cliente = vehiculo.Cliente;
                    //proforma.Vehiculo.IdCliente = vehiculo.IdCliente;

                    pROFORMABindingSource.ResetBindings(true);
                }

            }
            #endregion
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            CargarVehiculo();
        }

        private void CargarVehiculo()
        {
            var proforma = pROFORMABindingSource.Current as PROFORMA;

            if (placaTextBox.Text.Length == 0)
            {
                MessageBox.Show("Debe Ingresar un número de placa", "Mensaje", MessageBoxButtons.OK);
            }
            else
                if (placaTextBox.Text.Length > 6)
                {
                    var vehiculo = vehiculoBL.GetFromVehiculoByNPlaca(placaTextBox.Text);

                    if (vehiculo != null)
                    {
                        proforma.Vehiculo = vehiculo;
                        proforma.IdVehiculo = vehiculo.Id;

                        proforma.Vehiculo.Cliente = vehiculo.Cliente;
                        proforma.Vehiculo.IdCliente = vehiculo.IdCliente;

                        pROFORMABindingSource.ResetBindings(true);
                    }
                    else
                    {
                        var rpt = MessageBox.Show(this, string.Format("Vehículo no Existente ¿Desea crearlo?"),
                            "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                        if (rpt == DialogResult.Yes)
                        {
                            var addVehiculo = new FrmMttoVehiculo();
                            addVehiculo.AddVehiculoProforma(placaTextBox.Text);
                            addVehiculo.ShowDialog();
                            CargarVehiculo();
                        }
                        if (rpt == DialogResult.No)
                        {
                            proforma.Vehiculo = null;
                            proforma.IdVehiculo = 0;
                            pROFORMABindingSource.ResetBindings(true);
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Longitud de placa incorrecta", "Mensaje", MessageBoxButtons.OK);
                    proforma.Vehiculo = null;
                    proforma.IdVehiculo = 0;
                    pROFORMABindingSource.ResetBindings(true);
                }
        }

        //private void pRODUCTODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        //{
        //    if (this.pRODUCTODataGridView.Columns[e.ColumnIndex].Name.Equals("Agregar"))
        //    {
        //        AgregarProducto();
        //    }
        //}

        private void pRODUCTODataGridView_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            AgregarProducto();
        }

        private void CalcularTotal()
        {
            var proForma = pROFORMABindingSource.Current as PROFORMA;
            if (proForma != null)
            {
                proForma.Total = proForma.DetalleProforma.Sum(dv => dv.Monto);
                pROFORMABindingSource.ResetBindings(true);
            }
        }

        private void TxtProductoDesc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarProductoEnDetalle();
            }
        }

        private void btnBuscarDetalle_Click(object sender, EventArgs e)
        {
            BuscarProductoEnDetalle();
        }

        private void BuscarProductoEnDetalle()
        {

            List<DETALLEPROFORMA> listatemp = new List<DETALLEPROFORMA>();
            var _productotipovehiculo = pRODUCTO_TIPO_VEHICULOBindingSource.Current as PRODUCTO_TIPO_VEHICULO;
            var _proforma = pROFORMABindingSource.Current as PROFORMA;

            if (_proforma != null)
            {
                if (TxtProductoDesc.Text != null && TxtProductoDesc.Text != "" && TxtProductoDesc.Text != string.Empty)
                {
                    foreach (var item in _proforma.DetalleProforma)
                    {
                        var descMayus = (TxtProductoDesc.Text).ToUpper();
                        var itemPRO = (item.ProductoTipoVehiculo.PRODUCTO.Descripcion).ToUpper();
                        var a = itemPRO.Contains(descMayus);
                        if (a == true)
                        {
                            listatemp.Add(item);
                        }
                    }
                    detalleProformaBindingSource.DataSource = listatemp;
                    detalleProformaBindingSource.ResetBindings(true);
                }
                else
                {
                    detalleProformaBindingSource.DataSource = _proforma.DetalleProforma;
                    detalleProformaBindingSource.ResetBindings(true);
                }
            }
            else
                MessageBox.Show("No existen productos en el detalle", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void txtCriterio_KeyPress(object sender, KeyPressEventArgs e)
        {
            var slash = Convert.ToString("/") ;
            var coma = Convert.ToString(",");
            var guion = Convert.ToString("-");
            var punto = Convert.ToString(".");  

            string cadena = slash + coma + guion + punto + (char)8;

            if (Char.IsLetter(e.KeyChar) || cadena.Contains(e.KeyChar) || (char.IsNumber(e.KeyChar)))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void TxtProductoDesc_KeyPress(object sender, KeyPressEventArgs e)
        {
            var slash = Convert.ToString("/");
            var coma = Convert.ToString(",");
            var guion = Convert.ToString("-");
            var punto = Convert.ToString(".");

            string cadena = slash + coma + guion + punto + (char)8;

            if (Char.IsLetter(e.KeyChar) || cadena.Contains(e.KeyChar) || (char.IsNumber(e.KeyChar)))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void detalleProformaDataGridView_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            QuitarProducto();
        }

        private void detalleProformaDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            //MessageBox.Show("Asegurese de ingresar un valor correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void detalleProformaDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            var detalle = detalleProformaBindingSource.Current as DETALLEPROFORMA;

            if (e.ColumnIndex == 0 || e.ColumnIndex == 2 || e.ColumnIndex == 3)
            {
                //var producto = new PRODUCTO_TIPO_VEHICULO();
                //if (detalle != null)
                //{
                //    producto = productotipovehiculobl.GetFromProductoByID(detalle.IdProductoTipoVehiculo);
                //    if (detalle.Cantidad <= 0)
                //    {
                //        MessageBox.Show("La cantidad debe ser mayor a 0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //        detalle.Cantidad = 1;
                //    }
                    //else
                    //{
                    //    if (producto.ProductoServicio == false)
                    //    {
                    //        if (detalle.Cantidad > producto.Stock)
                    //        {
                    //            MessageBox.Show("La cantidad supera el stock disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    //            detalle.Cantidad = producto.Stock;
                    //        }
                    //    }
                    //    else
                    //        detalle.Cantidad = 1;
                    //}
                    CalcularTotal();
                
            }



            //if (detalleProformaDataGridView.Columns[e.ColumnIndex].Name == "Combo")
            //{

            //    //
            //    // se obtiene el valor seleccionado en el combo
            //    //
            //    DataGridViewComboBoxCell combo = detalleProformaDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell;
            //    int idUnd = Convert.ToInt32(combo.Value);
            //    var und = unidaMedidaBL.GetFromUnidadMedidaById(idUnd);
            //    detalle.IdUnidadMedida = idUnd;
            //    detalle.UnidadMedida = und;
            //    detalleProformaBindingSource.ResetBindings(true);
            //}
        }

        private void detalleProformaDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                QuitarProducto();
            }
        }

        private void detalleProformaDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            var _detalle = detalleProformaBindingSource.Current as DETALLEPROFORMA;
            var _unidadMedida = uNIDADMEDIDABindingSource.Current as UNIDAD_MEDIDA;

            if (this.detalleProformaDataGridView.Columns[e.ColumnIndex].Name.Equals("Quitar"))
            {
                QuitarProducto();
            }
            CalcularTotal();

            //if (this.detalleProformaDataGridView.Columns[e.ColumnIndex].Name.Equals("Combo"))
            //{
            //    _detalle.UnidadMedida = _unidadMedida;
            //    _detalle.IdUnidadMedida = _unidadMedida.Id;
            //}
            //else
            //{
            //    _detalle.UnidadMedida = _unidadMedida;
            //    _detalle.IdUnidadMedida = _unidadMedida.Id;
            //    pROFORMABindingSource.ResetBindings(true);
            //    detalleProformaBindingSource.ResetBindings(true);
            //}
        }

        private void detalleProformaDataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            //if (e.Control is ComboBox)
            //{
            //    DataGridViewComboBoxEditingControl dgvCombo = e.Control as DataGridViewComboBoxEditingControl;
            //    // se remueve el handler previo que pudiera tener asociado, a causa ediciones previas de la celda
            //    // evitando asi que se ejecuten varias veces el evento

            //    dgvCombo.SelectedIndexChanged -= new EventHandler(dvgCombo_SelectedIndexChanged);
            //    dgvCombo.SelectedIndexChanged += new EventHandler(dvgCombo_SelectedIndexChanged);

            //    var _detalle = detalleProformaBindingSource.Current as DETALLEPROFORMA;
            //    var _unidadMedida = uNIDADMEDIDABindingSource.Current as UNIDAD_MEDIDA;
            //    _detalle.UnidadMedida = _unidadMedida;
            //    _detalle.IdUnidadMedida = _unidadMedida.Id;
            //    ////pROFORMABindingSource.ResetBindings(true);
            //    detalleProformaBindingSource.ResetBindings(true);
            //}
        }

        private void CbEmpresa_Click(object sender, EventArgs e)
        {
            CbEmpresa.DataSource = empresabl.GetAllFromEmpresa();
        }

        private void CbEmpresa_SelectedValueChanged(object sender, EventArgs e)
        {
            if (CbEmpresa.SelectedValue != null)
            {
                var a = Convert.ToInt32(CbEmpresa.SelectedValue.ToString());
                CbTipoVehiculo.DataSource = tipovehiculobl.GetAllFromTipoVehiculoByEmpresaId(a);   
            }
        }

        private void CbTipoVehiculo_Click(object sender, EventArgs e)
        {
            if (CbEmpresa.SelectedValue != null)
            {
                var a = Convert.ToInt32(CbEmpresa.SelectedValue.ToString());
                CbTipoVehiculo.DataSource = tipovehiculobl.GetAllFromTipoVehiculoByEmpresaId(a);         
            }
        }

        private void BtnActivarProductos_Click(object sender, EventArgs e)
        {
            if (CbTipoVehiculo.SelectedValue != null)
            {
                var a = Convert.ToInt32(CbTipoVehiculo.SelectedValue.ToString());
                pRODUCTO_TIPO_VEHICULOBindingSource.DataSource = productotipovehiculobl.GetAllFromProductoTipoVehiculoByTipoVehiculo(a);
                GBEmpresa.Enabled = false;
                groupBox3.Enabled = true;
                groupBox1.Enabled = true;
                groupBox2.Enabled = true;
                btnGuardar.Enabled = true;
            }
            else
            {
                MessageBox.Show(this, string.Format("Debe Seleccionar un Tipo de Vehículo"),
                 "Mensaje", MessageBoxButtons.OK);
            }
        }

        private void pRODUCTO_TIPO_VEHICULODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.pRODUCTO_TIPO_VEHICULODataGridView.Columns[e.ColumnIndex].Name.Equals("AgregarProductoTipoVehiculo"))
            {
                AgregarProducto();
            }
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            var frm = new FrmCartillaPrecio();
            frm.ShowDialog();
        }

        private void ChBServProg_CheckedChanged(object sender, EventArgs e)
        {
            if (ChBServProg.Checked)
            {
                CBServicioProgramado.Enabled = true;
                BtnCargarServ.Enabled = true;
                var a = Convert.ToInt32(CbTipoVehiculo.SelectedValue.ToString());
                CBServicioProgramado.DataSource = servicioprogramadobl.GetAllFromServicioProgramadoByIdTipoVehiculo(a);
            }
            else
            {
                CBServicioProgramado.Enabled = false;
                BtnCargarServ.Enabled = true;
            }
        }

        private void BtnCargarServ_Click(object sender, EventArgs e)
        {
            if (CBServicioProgramado.SelectedValue != null)
            {
                var a = Convert.ToInt32(CBServicioProgramado.SelectedValue.ToString());

                var _servicioprogramado = servicioprogramadobl.GetFromServicioProgramadoById(a);

                foreach (var item in _servicioprogramado.CARTERASERVICIOPROGRAMADO)
                {
                    AgregarProductoProgramado(item);
                }
            }
            GBServProg.Enabled = false;
        }

        private void AgregarProductoProgramado(CARTERASERVICIOPROGRAMADO item)
        {
            var currentProforma = pROFORMABindingSource.Current as PROFORMA;
            

            #region AddServicio
            if (item.PRODUCTO_TIPO_VEHICULO != null && item.PRODUCTO_TIPO_VEHICULO.PRODUCTO.ProductoServicio == true)
            {
                #region AddDetalle
                var _detalle = new DETALLEPROFORMA()
                {
                    IdProforma = currentProforma.Id,
                    ProductoTipoVehiculo = item.PRODUCTO_TIPO_VEHICULO,
                    IdProductoTipoVehiculo = item.PRODUCTO_TIPO_VEHICULO.Id,
                    Cantidad = item.Cantidad,
                    //IdUnidadMedida = 1,
                    //UnidadMedida = unidaMedidaBL.GetFromUnidadMedidaById(1),
                    PrecioServicioUnit = item.PRODUCTO_TIPO_VEHICULO.Precio
                };
                #endregion

                var existe = currentProforma.DetalleProforma.Where(dv => dv.ProductoTipoVehiculo.Id.Equals(item.PRODUCTO_TIPO_VEHICULO.Id)).SingleOrDefault();
                if (existe == null)
                {
                    currentProforma.DetalleProforma.Add(_detalle);
                    currentProforma.Total = currentProforma.DetalleProforma.Sum(dv => dv.Monto);
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El Servicio {0} " + " ya se encuentra en la proforma", item.PRODUCTO_TIPO_VEHICULO.PRODUCTO.Descripcion),
                        "Mensaje", MessageBoxButtons.OK);
                }

                pROFORMABindingSource.ResetBindings(true);
                detalleProformaBindingSource.ResetBindings(true);

            }

            #endregion


            #region AddProducto
            if (item.PRODUCTO_TIPO_VEHICULO != null && item.PRODUCTO_TIPO_VEHICULO.PRODUCTO.ProductoServicio == false)
            {
                #region AddDetalle
                var _detalle = new DETALLEPROFORMA()
                {
                    IdProforma = currentProforma.Id,
                    ProductoTipoVehiculo = item.PRODUCTO_TIPO_VEHICULO,
                    IdProductoTipoVehiculo = item.PRODUCTO_TIPO_VEHICULO.Id,
                    Cantidad = item.Cantidad,
                    //IdUnidadMedida = 1,
                    //UnidadMedida = unidaMedidaBL.GetFromUnidadMedidaById(1),
                    PrecioServicioUnit = item.PRODUCTO_TIPO_VEHICULO.Precio
                };
                #endregion

                var existe = currentProforma.DetalleProforma.Where(dv => dv.ProductoTipoVehiculo.Id.Equals(item.PRODUCTO_TIPO_VEHICULO.Id)).SingleOrDefault();
                if (existe == null)
                {
                    currentProforma.DetalleProforma.Add(_detalle);
                    currentProforma.Total = currentProforma.DetalleProforma.Sum(dv => dv.Monto);
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El Producto {0} " + " ya se encuentra en la proforma\n Desea agregar otro?", item.PRODUCTO_TIPO_VEHICULO.PRODUCTO.Descripcion),
                    "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (rpt == DialogResult.Yes)
                    {
                        existe.Cantidad++;
                        currentProforma.Total = currentProforma.DetalleProforma.Sum(dv => dv.Monto);
                        CalcularTotal();
                    }
                }

                pROFORMABindingSource.ResetBindings(true);
                detalleProformaBindingSource.ResetBindings(true);
            }

            #endregion
        }

       

        //private void dvgCombo_SelectedIndexChanged(object sender, EventArgs e)
        //{
        //    // se recupera el valor del combo
        //    // a modo de ejemplo se escribe en consola el valor seleccionado

        //    ComboBox combo = sender as ComboBox;
        //    Console.WriteLine(combo.SelectedValue);
        //    // se accede a la fila actual, para trabajr con otor de sus campos
        //    // en este caso se marca el check si se cambia la seleccion

        //    DataGridViewRow row = detalleProformaDataGridView.CurrentRow;

        //    DataGridViewComboBoxCell cell = row.Cells["Combo"] as DataGridViewComboBoxCell;

        //} 

     
       



    }
}
